#ifndef DATACONTROLLER_H
#define DATACONTROLLER_H

#include <QObject>
#include <QDateTime>
#include "services/CsvExporter.h"
#include "services/DatabaseService.h"
#include "models/HistoryModel.h"
#include "models/DataRecordModel.h"

/**
 * @brief 数据控制器
 * @details Controller 层，协调数据管理业务流程：
 *          - 历史数据查询（调用 HistoryModel）
 *          - CSV 导出（调用 CsvExporter）
 *          - 数据统计分析
 *          - 数据清理维护
 *          - 暴露 Q_INVOKABLE 方法给 QML 调用
 */
class DataController : public QObject
{
    Q_OBJECT
    Q_PROPERTY(bool isExporting READ isExporting NOTIFY isExportingChanged)
    Q_PROPERTY(int exportProgress READ exportProgress NOTIFY exportProgressChanged)
    Q_PROPERTY(QString exportStatus READ exportStatus NOTIFY exportStatusChanged)

public:
    explicit DataController(QObject *parent = nullptr);
    ~DataController();

    // 设置关联的 Model
    void setHistoryModel(HistoryModel *model);
    void setDataRecordModel(DataRecordModel *model);

    // 属性访问器
    bool isExporting() const { return m_isExporting; }
    int exportProgress() const { return m_exportProgress; }
    QString exportStatus() const { return m_exportStatus; }

    // 历史数据查询（快捷方法）
    Q_INVOKABLE bool queryLastHours(const QString &deviceId, int hours);
    Q_INVOKABLE bool queryLastDays(const QString &deviceId, int days);
    Q_INVOKABLE bool queryToday(const QString &deviceId);
    Q_INVOKABLE bool queryYesterday(const QString &deviceId);
    Q_INVOKABLE bool queryDateRange(const QString &deviceId, const QDateTime &start, const QDateTime &end);
    Q_INVOKABLE bool queryAllDevices();

    // CSV 导出
    Q_INVOKABLE bool exportToCsv(const QString &filePath);
    Q_INVOKABLE bool exportDeviceData(const QString &deviceId, const QString &filePath);
    Q_INVOKABLE bool exportDateRange(const QString &deviceId,
                                     const QDateTime &start,
                                     const QDateTime &end,
                                     const QString &filePath);
    Q_INVOKABLE bool exportCurrentQuery(const QString &filePath);

    // 数据统计
    Q_INVOKABLE double getAverageTemperature(const QString &deviceId = QString()) const;
    Q_INVOKABLE double getAveragePressure(const QString &deviceId = QString()) const;
    Q_INVOKABLE double getAverageFlow(const QString &deviceId = QString()) const;

    Q_INVOKABLE double getMaxTemperature(const QString &deviceId = QString()) const;
    Q_INVOKABLE double getMaxPressure(const QString &deviceId = QString()) const;
    Q_INVOKABLE double getMaxFlow(const QString &deviceId = QString()) const;

    Q_INVOKABLE double getMinTemperature(const QString &deviceId = QString()) const;
    Q_INVOKABLE double getMinPressure(const QString &deviceId = QString()) const;
    Q_INVOKABLE double getMinFlow(const QString &deviceId = QString()) const;

    // 数据维护
    Q_INVOKABLE bool clearRealtimeData(int daysToKeep);
    Q_INVOKABLE bool clearDeviceData(const QString &deviceId);
    Q_INVOKABLE bool clearAllData();
    Q_INVOKABLE bool optimizeDatabase();

    // 数据库信息
    Q_INVOKABLE int getRealtimeDataCount() const;
    Q_INVOKABLE int getDeviceDataCount(const QString &deviceId) const;
    Q_INVOKABLE qint64 getDatabaseSize() const;

    // 获取设备列表（有数据的设备）
    Q_INVOKABLE QStringList getDevicesWithData() const;

signals:
    // 属性变化信号
    void isExportingChanged();
    void exportProgressChanged();
    void exportStatusChanged();

    // 查询相关信号
    void queryCompleted(bool success, int recordCount);
    void queryFailed(const QString &error);

    // 导出相关信号
    void exportStarted();
    void exportCompleted(const QString &filePath);
    void exportFailed(const QString &error);

    // 数据清理信号
    void dataCleared(int recordsRemoved);
    void databaseOptimized();

private slots:
    // CsvExporter 信号处理
    void onExportProgress(int current, int total);
    void onExportCompleted(bool success, const QString &filePath);

private:
    // 更新导出状态
    void updateExportStatus(const QString &status);
    void setExportProgress(int progress);
    void setIsExporting(bool exporting);

    // 执行数据清理
    bool executeDataCleanup(const QString &tableName, const QString &condition);

private:
    HistoryModel *m_historyModel;       // 历史数据模型
    DataRecordModel *m_dataRecordModel; // 实时数据模型
    CsvExporter *m_csvExporter;         // CSV 导出器

    bool m_isExporting;     // 是否正在导出
    int m_exportProgress;   // 导出进度（0-100）
    QString m_exportStatus; // 导出状态文本
};

#endif // DATACONTROLLER_H
